package org.Boring.ODCode.Easy;

import java.util.*;

//描述
//输入一个只包含小写英文字母和数字的字符串，按照不同字符统计个数由多到少输出统计结果，如果统计的个数相同，则按照ASCII码由小到大排序输出。
//输入：
//aaddccdc
//输出：
//复制
//说明：
//样例里，c和d出现3次，a出现2次，但c的ASCII码比d小，所以先输出c，再输出d，最后输出a.
public class HJ102 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            Map<Character, Integer> dataMap = new TreeMap<>();
            String input = in.nextLine();
            composeMap(input, dataMap);
            getResult(dataMap);
        }
    }

    private static void composeMap(String input,
                                   Map<Character, Integer> data) {
        // ASCII 码值从小到大存入TreeMap
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (data.containsKey(ch)) {
                int v = data.get(ch);
                v = v + 1;
                data.put(ch, v);
            } else {
                data.put(ch, 1);
            }
        }
    }

    private static void getResult(Map<Character, Integer> data) {
        StringBuilder sb = new StringBuilder();
        while (!data.isEmpty()) {
            int max = 0;
            int count = 0;
            // 依次获取最大值，删除
            for (char key : data.keySet()) {
                int value = data.get(key);
                if (value > max) {
                    max = value;
                }
            }
            List<Character> list = new ArrayList<>();
            for (char key : data.keySet()) {
                if (max == data.get(key)) {
                    list.add(key);
                }

            }
            //放入列表中删除
            for (int i = 0; i < list.size(); i++) {
                char cha = list.get(i);
                sb.append(cha);
                data.remove(cha);
            }
        }
        System.out.println(sb.toString());
    }

}